home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 5: The Fifth Dimension / 17 Bit - The Fifth Dimension (1995)(17 Bit Software)[!].iso / files / 3581.dms / 3581.adf / Grapevine / irclink.c < prev    next >
C/C++ Source or Header  |  1994-05-24  |  4KB  |  185 lines

  1. #include <sys/time.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <termios.h>
  7. #include <stdio.h>
  8. #include <fcntl.h>
  9. #include <signal.h>
  10.  
  11. #ifndef INADDR_NONE
  12. #define INADDR_NONE -1
  13. #endif
  14.  
  15. #define BUFSIZE 32
  16.  
  17. struct termios temp_tios;
  18. int temp;
  19. temp = 0;
  20.  
  21. int CleanUp( i )
  22. int i;
  23. {
  24.     if( temp )
  25.         tcsetattr( 0, TCSANOW, &temp_tios );
  26.     fcntl( 0, F_SETFL, fcntl( 0, F_GETFL, 0 ) & ~O_NDELAY );
  27.     exit( 0 );
  28. }
  29.  
  30. int HandleIO( fd )   /* Shuffle data between fd and stdin/stdout */
  31. int fd;
  32. {
  33.     int result, i;
  34.     char inbuf[BUFSIZE];
  35.     struct fd_set rd;
  36.     struct fd_set zer;
  37.     struct termios tios;
  38.     struct timeval timeout;
  39.  
  40.     signal( SIGINT,  (void *) CleanUp );    /* Clean up sockets when killed */
  41.     signal( SIGTSTP, (void *) CleanUp );
  42.     signal( SIGSEGV, (void *) CleanUp );
  43.     signal( SIGBUS,  (void *) CleanUp );
  44.     signal( SIGQUIT, (void *) CleanUp );
  45.     signal( SIGKILL, (void *) CleanUp );
  46.  
  47.     tcgetattr( 0, &tios );        /* Get attributes for stdin                */
  48.     temp_tios = tios;            /* Make copy of tios for restoration    */
  49.     temp =1;
  50.     tios.c_lflag &= ~ICANON;    /* Disable canonical input              */
  51.     tios.c_cc[VMIN] = 1;        /* Read at least 1 character            */
  52.     tios.c_cc[VTIME] = 0;        /* Disable timeout                        */
  53.     tios.c_lflag &= ~ECHO;        /* No echo                                */
  54.     tios.c_lflag &= ~ISIG;        /* Disable input signals                */
  55.     tios.c_cflag &= ~CSIZE;
  56.     tios.c_cflag |=  CS8;        /* 8 bit connection                        */
  57.     tios.c_cflag &= ~PARENB;    /* No output parity                        */
  58.     tios.c_iflag &= ~INPCK;        /* No input parity                        */
  59.     tios.c_iflag &= ~ISTRIP;    /* Do not strip 8th bit                    */
  60.     tios.c_iflag &= ~IXON;        /* Disable XON/XOFF                        */
  61.     tios.c_iflag &= ~IXOFF;
  62.     tios.c_iflag &= ~INLCR;        /* No NL -> CR remapping                */
  63.     tios.c_iflag &= ~ICRNL;        /* No NL -> CR remapping                */
  64.     tios.c_oflag &= ~OPOST;        /* Disable output post processing        */
  65.  
  66.     tcsetattr( 0, TCSANOW, &tios );
  67.  
  68.     timeout.tv_sec = 1;
  69.     timeout.tv_usec = 0;
  70.  
  71.     fcntl( 0, F_SETFL, O_NDELAY );    /* Disable read blocking */
  72.     fcntl( fd, F_SETFL, O_NDELAY );
  73.     while( 1 )
  74.     {
  75.         FD_ZERO( &rd );
  76.         FD_SET( 0, &rd );    /* Determine whether 0 can be read    */
  77.         FD_SET( fd, &rd );    /* Determine whether fd can be read    */
  78.         FD_ZERO( &zer );    /* No write or exception queries    */
  79.  
  80.         if( select( NFDBITS, &rd, &zer, &zer, &timeout ) != -1 )
  81.         {
  82.             if( FD_ISSET( 0, &rd ) )
  83.             {  /* read zero */
  84.                 result = read( 0, inbuf, BUFSIZE );
  85.                 if( result > 0 )
  86.                 {
  87.                     write( fd, inbuf, result );
  88.                 }
  89.                 if( result < 0 )
  90.                 {
  91.                     printf( "\n\nEOF detected, exiting.\n" );
  92.                     CleanUp( 0 );
  93.                 }
  94.             }
  95.             if( FD_ISSET( fd, &rd ) )
  96.             {
  97.                 result = read( fd, inbuf, BUFSIZE );
  98.                 if( result > 0 )
  99.                     write( 1, inbuf, result );
  100.                 if( result < 0 )
  101.                 {
  102.                     printf( "\n\nERROR: Connection to server lost, quitting.\n" );
  103.                     CleanUp(0);
  104.                 }
  105.             }
  106.         }
  107.     }
  108. }
  109.  
  110. int ConnectToServer( servername, port )
  111. char *servername;
  112. int port;
  113. {
  114.     int sock;
  115.     struct hostent *host;
  116.     struct sockaddr_in serv;
  117.  
  118.     printf( "Connecting to server %s port %ld.\n", servername, port );
  119.  
  120.     sock = socket( AF_INET,SOCK_STREAM,0 );
  121.     if( sock < 0 )
  122.     {
  123.         fprintf( stderr, "irclink: Could not get socket.\n" );
  124.         return( -1 );
  125.     }
  126.  
  127.     serv.sin_addr.s_addr = inet_addr( servername );
  128.     serv.sin_port = htons( port );
  129.     serv.sin_family = AF_INET;
  130.  
  131.     if( serv.sin_addr.s_addr == INADDR_NONE )
  132.     {
  133.         if( host = (struct hostent *) gethostbyname( servername ) )
  134.         {
  135.             memcpy( &serv.sin_addr, host->h_addr, host->h_length );
  136.         }
  137.         else
  138.         {
  139.             fprintf( stderr, "irclink: Unknown host.\n" );
  140.             return( -1 );
  141.         }
  142.     }
  143.  
  144.     if( connect( sock, &serv, sizeof( struct sockaddr_in ) ) == -1)
  145.         return( -1 );
  146.     else
  147.         return( sock );
  148. }
  149.  
  150. main( argc, argv )
  151. int argc;
  152. char **argv;
  153. {
  154.     char buf[2];
  155.     char *cmdarg;
  156.     char *servername;
  157.     int sock;
  158.     int port;
  159.     port = 6667;
  160.  
  161.     if( argv[1] )
  162.         servername = argv[1];
  163.     else
  164.     {
  165.         printf( "Usage 2: %s server [port]\n", argv[0] );
  166.         exit( 1 );
  167.     }
  168.  
  169.     if( argv[2] )
  170.         port = atoi( argv[2] );
  171.  
  172.     sock = ConnectToServer( servername, port );
  173.  
  174.     if( sock < 0 )
  175.     {
  176.         fprintf( stderr, "irclink: Could not connect to server.\n" );
  177.         exit( 5 );
  178.     }
  179.  
  180.     printf( "Connected to server %s.\n", servername );
  181.     HandleIO( sock );
  182.     CleanUp( 0 );    /* make sure to clean up */
  183.     return( 0 );
  184. }
  185.